#ifndef __PROPERTY_HH__
#define __PROPERTY_HH__

namespace Reflection
{

/**
 * @class Property
 * @brief Represents class member property, it is only type representation, so it must
 *          be created and binded with the object before can be used.
 */
template<
          typename TClassType
        , typename TPropertyType
        , typename TPropertyType::Type TClassType::Type::*TPropertyPtr
        , const char* TName >
class Property
{
    public:
        typedef typename TClassType::Type       ClassType;
        typedef typename TPropertyType::Type    PropertyType;

        //definition of pointer to member type
        typedef PropertyType ClassType::*PointerToMember;
        
        /// this is pointer to member accessor
        static PointerToMember iPointerToMember;
};

template<
        typename TClassType
        , typename TPropertyType
        , typename TPropertyType::Type TClassType::Type::*TPropertyPtr
        , const char* TName >
                
typename Property<
          TClassType
        , TPropertyType
        , TPropertyPtr
        , TName >::PointerToMember
                
        Property<
                  TClassType
                , TPropertyType
                , TPropertyPtr
                , TName >::iPointerToMember = TPropertyPtr;

} // namespace Reflection

#endif //__PROPERTY_HH__